<!DOCTYPE html>
<title>Service Worker: notificationclick can focus WindowClient</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
if (window.testRunner)
    testRunner.setPermission('notifications', 'granted', location.origin, location.origin);

var t = async_test('notificationclick can focus WindowClient');
t.step(function() {
    var scope = 'resources/blank.html'
    service_worker_unregister_and_register(
        t, 'resources/notificationclick-can-focus.js', scope)
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() { return with_iframe(scope); })
      .then(function(frame) {
          var w = frame.contentWindow;
          w.navigator.serviceWorker.onmessage = t.step_func(onMessage);
          w.navigator.serviceWorker.controller.postMessage('start');
        })
      .catch(unreached_rejection(t));

    var result = [];
    var expected = ['focus() outside of a notificationclick event failed',
                    'focus() in notificationclick outside of waitUntil but in stack succeeded',
                    'focus() in notificationclick outside of waitUntil not in stack failed',
                    'focus() in notificationclick\'s waitUntil suceeded',
                    'focus() called twice failed',
                    'focus() failed after timeout',
                    'focus() failed because a window was opened before'];

    function onMessage(e) {
      var message = e.data;

      if (typeof(message) === 'object') {
        if (message.type !== 'click')
          return;
        if (window.testRunner)
          testRunner.simulateWebNotificationClick(message.title);
        return;
      }

      if (message === 'quit') {
        assert_array_equals(result, expected,
                            'Worker should post back expected messages.');
        service_worker_unregister_and_done(t, scope);
      } else {
        result.push(message);
      }
    }
  });
</script>
